#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/io.h>

#define PHY_ADDR 0x00000000571a2000  // 物理地址
#define SIZE     64 * 1024 * 1024    // 大小（64MB）

static int __init dump_swiotlb_init(void)
{
    void __iomem *ioaddr;
    int i;

    // 映射物理内存到内核空间
    ioaddr = ioremap(PHY_ADDR, SIZE);
    if (!ioaddr) {
        printk(KERN_ERR "ioremap failed\n");
        return -ENOMEM;
    }

    // 打印内存内容
    for (i = 0; i < SIZE; i += 4) {
        printk(KERN_INFO "SWIOTLB content:%08x\n", ioread32(ioaddr + i));
    }

    // 解除映射
    iounmap(ioaddr);

    return 0;
}

static void __exit dump_swiotlb_exit(void)
{
    printk(KERN_INFO "Module unloaded\n");
}

module_init(dump_swiotlb_init);
module_exit(dump_swiotlb_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Liuxh");
MODULE_DESCRIPTION("A module to dump swiotlb memory");

